Skill

Process এবং ProcessBuilder

Java Technologies - Java.lang প্যাকেজ (Java.lang Package)
310

Java-তে Process এবং ProcessBuilder হল দুটি ক্লাস যা প্রসেসের পরিচালনা এবং অপারেটিং সিস্টেমের কমান্ড এক্সিকিউট করার জন্য ব্যবহৃত হয়। এগুলি Java প্রোগ্রামের মধ্যে বাহ্যিক অ্যাপ্লিকেশন বা কমান্ড চালানোর জন্য অত্যন্ত গুরুত্বপূর্ণ।

1. Process Class

Process ক্লাস Java-তে একটি চলমান প্রসেসের প্রতিনিধিত্ব করে। এটি অপারেটিং সিস্টেমের একটি কমান্ড বা অ্যাপ্লিকেশন চালানোর পর, সেই চলমান প্রসেসের ইনফরমেশন বা সেসম্পর্কিত কার্যক্রম পরিচালনা করতে ব্যবহৃত হয়।

Process ক্লাসের কিছু গুরুত্বপূর্ণ মেথড:

  • waitFor(): প্রসেসের শেষ হওয়া পর্যন্ত অপেক্ষা করে।
  • getInputStream(): প্রসেসের আউটপুট স্ট্রিম অ্যাক্সেস করার জন্য।
  • getOutputStream(): প্রসেসের ইনপুট স্ট্রিম অ্যাক্সেস করার জন্য।
  • getErrorStream(): প্রসেসের এরর আউটপুট স্ট্রিম অ্যাক্সেস করার জন্য।
Process Class Example:
import java.io.*;

public class ProcessExample {
    public static void main(String[] args) {
        try {
            // Run a command (like "dir" on Windows or "ls" on Linux)
            Process process = Runtime.getRuntime().exec("dir");

            // Get the input stream of the process (output from the command)
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);  // Print the output of the command
            }

            // Wait for the process to finish
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Explanation:

  • এখানে, Runtime.getRuntime().exec("dir") কমান্ডটি Windows এ dir কমান্ড চালায়, যা ডিরেক্টরি তালিকা দেখাবে। এটি একটি নতুন প্রসেস চালানোর জন্য ব্যবহৃত হয়।
  • getInputStream() মেথডটি প্রসেসের আউটপুট স্ট্রিম ফিরিয়ে দেয়।
  • waitFor() মেথডটি প্রসেসটি শেষ হওয়া পর্যন্ত থামিয়ে রাখে।

2. ProcessBuilder Class

ProcessBuilder ক্লাসটি একটি উন্নত এবং সুবিধাজনক পদ্ধতি প্রদান করে প্রসেস চালানোর জন্য। এটি Process ক্লাসের চেয়ে বেশি কাস্টমাইজেশন প্রদান করে, যেমন ইনপুট, আউটপুট এবং এরর স্ট্রিমগুলো পরিচালনা করা, কমান্ড আর্গুমেন্ট পাস করা এবং পরিবেশ পরিবর্তন করা। এর মাধ্যমে আপনি প্রসেসের আউটপুট বা ইনপুট স্ট্রিমগুলো আরো বেশি নিয়ন্ত্রণ করতে পারেন।

ProcessBuilder ক্লাসের কিছু গুরুত্বপূর্ণ মেথড:

  • command(): প্রসেস চালানোর জন্য কমান্ড এবং আর্গুমেন্ট নির্ধারণ করে।
  • directory(): প্রসেসের জন্য কাজ করার ডিরেক্টরি নির্ধারণ করে।
  • environment(): প্রসেসের পরিবেশ (environment) পরিবর্তন করতে ব্যবহৃত হয়।
  • start(): প্রসেসটি শুরু করে।
ProcessBuilder Class Example:
import java.io.*;
import java.util.*;

public class ProcessBuilderExample {
    public static void main(String[] args) {
        // Create a ProcessBuilder instance with the command to execute
        ProcessBuilder processBuilder = new ProcessBuilder("dir");

        // Optionally, you can set the working directory for the process
        processBuilder.directory(new File("C:/"));

        // Optionally, you can modify environment variables for the process
        Map<String, String> environment = processBuilder.environment();
        environment.put("MY_ENV_VAR", "some_value");

        try {
            // Start the process
            Process process = processBuilder.start();

            // Get the input stream of the process (output from the command)
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);  // Print the output of the command
            }

            // Wait for the process to finish
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Explanation:

  • এখানে ProcessBuilder ব্যবহার করে dir কমান্ড চালানো হয়েছে। এটি প্রসেসের আউটপুট স্ট্রিম নিয়ে আসে এবং সেটি কনসোলে প্রিন্ট করে।
  • directory() মেথডের মাধ্যমে প্রসেসের কাজ করার ডিরেক্টরি নির্ধারণ করা হয়েছে। এটি নিশ্চিত করে যে প্রসেসটি সঠিক ডিরেক্টরিতে কাজ করবে।
  • environment() মেথডের মাধ্যমে আমরা প্রসেসের জন্য একটি নতুন পরিবেশ ভেরিয়েবল (environment variable) সেট করতে পারি।

Process এবং ProcessBuilder এর মধ্যে পার্থক্য:

FeatureProcessProcessBuilder
Ease of UseMore basic and less flexibleMore flexible and customizable
Command ExecutionUse Runtime.getRuntime().exec()Use ProcessBuilder class
Environment CustomizationLimited customizationFull control over environment variables
Directory CustomizationNot possible (must use exec with full path)Allows setting a specific working directory
Handling Input/OutputRequires manual handling of streamsAutomatically handles input/output streams
Multiple CommandsCannot run multiple commands togetherCan execute multiple commands in sequence

  • Process Class: যদি আপনাকে একটি সিম্পল কমান্ড বা অ্যাপ্লিকেশন চালাতে হয় এবং আপনার কাস্টমাইজেশন বা প্রসেসের আউটপুট স্ট্রিম নিয়ন্ত্রণ করার প্রয়োজন না থাকে, তবে Process ক্লাস ব্যবহার করা উপযুক্ত।
  • ProcessBuilder Class: যদি আপনাকে আরও কাস্টমাইজেশন (যেমন, ডিরেক্টরি সেট করা, পরিবেশ পরিবর্তন করা, ইনপুট/আউটপুট স্ট্রিম হ্যান্ডলিং) এবং একাধিক কমান্ড চালাতে হয়, তবে ProcessBuilder একটি ভালো অপশন।

এখন আপনি আপনার প্রয়োজন অনুযায়ী Process এবং ProcessBuilder এর মধ্যে সঠিক পছন্দ করতে পারবেন।

Content added By

Process ক্লাস এবং External Process Management

275

Java-তে Process ক্লাস এবং External Process Management হল একটি গুরুত্বপূর্ণ ফিচার যা Java প্রোগ্রামকে অন্যান্য সিস্টেম প্রোগ্রাম বা কমান্ডগুলোর সাথে ইন্টারঅ্যাক্ট করতে সহায়তা করে। এটি Java অ্যাপ্লিকেশন থেকে বাইরের প্রোগ্রাম বা সিস্টেম কমান্ড চালাতে এবং তাদের আউটপুট এবং ইনপুট পরিচালনা করতে সক্ষম করে।

Process ক্লাস:

Process ক্লাস Java-তে এক্সটার্নাল (বাইরের) প্রোগ্রাম চালানোর জন্য ব্যবহৃত হয়। এটি বাইরের প্রোগ্রাম বা কমান্ডের সাথে যোগাযোগ করার জন্য একাধিক মেথড প্রদান করে, যেমন প্রোগ্রাম চালানো, আউটপুট নেওয়া, ইনপুট পাঠানো ইত্যাদি। এটি Java প্রোগ্রামের জন্য এক ধরনের ইন্টারফেস হিসেবে কাজ করে যা বাইরের সিস্টেম প্রোগ্রামগুলোর সাথে সমন্বয় সাধন করে।

Process ক্লাসের প্রধান বৈশিষ্ট্য:

  1. Start External Processes: Process ক্লাস বাইরের প্রোগ্রাম চালানোর জন্য ব্যবহৃত হয়।
  2. Redirect Input/Output: বাইরের প্রোগ্রাম থেকে আউটপুট নেয় এবং ইনপুট পাঠায়।
  3. Process Management: প্রক্রিয়া (process) কন্ট্রোল, যেমন termination চেক করা, প্রক্রিয়ার স্ট্যাটাস ইত্যাদি।

Process ক্লাসের প্রধান মেথডসমূহ:

  1. exec():

    • exec() মেথড ব্যবহার করে Java প্রোগ্রাম বাইরের কমান্ড বা প্রোগ্রাম চালাতে পারে।
    • এটি বাইরের প্রোগ্রাম চালাতে এবং তার আউটপুট এবং ইনপুট পরিচালনা করতে সহায়তা করে।

    Syntax:

    Process process = Runtime.getRuntime().exec("command");
    

    উদাহরণ:

    Process process = Runtime.getRuntime().exec("notepad");  // Opens Notepad
    
  2. getInputStream():
    • এটি বাইরের প্রোগ্রামের আউটপুটের স্ট্রিম রিটার্ন করে। আপনি এই স্ট্রিম ব্যবহার করে বাইরের প্রোগ্রামের আউটপুট পড়তে পারেন।
  3. getOutputStream():
    • এটি বাইরের প্রোগ্রামের ইনপুট স্ট্রিম রিটার্ন করে। আপনি এই স্ট্রিম ব্যবহার করে বাইরের প্রোগ্রামে ডেটা পাঠাতে পারেন।
  4. waitFor():

    • waitFor() মেথড ব্যবহার করে আপনি বাইরের প্রোগ্রামের completion বা termination পর্যন্ত অপেক্ষা করতে পারেন। এটি প্রোগ্রামটির exit status রিটার্ন করে।

    Syntax:

    int exitCode = process.waitFor();
    
  5. destroy():
    • বাইরের প্রোগ্রাম বা process শেষ করতে destroy() মেথড ব্যবহার করা হয়।

Process এবং External Process Management Example:

এখানে একটি উদাহরণ দেওয়া হলো যেখানে Java প্রোগ্রামটি বাইরের প্রোগ্রাম বা কমান্ড চালাবে এবং তার আউটপুট পড়বে।

উদাহরণ 1: বাইরের কমান্ড চালানো এবং আউটপুট দেখানো

import java.io.*;

public class ExternalProcessExample {
    public static void main(String[] args) {
        try {
            // Create a Process to run the "dir" command (for Windows)
            Process process = Runtime.getRuntime().exec("dir");

            // Get the input stream to read the output of the command
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            
            // Read and print the output line by line
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // Wait for the process to terminate
            int exitCode = process.waitFor();
            System.out.println("Process terminated with exit code: " + exitCode);

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Explanation:

  • এখানে আমরা Windows এর dir কমান্ড চালাচ্ছি, যা বর্তমান ডিরেক্টরির ফাইলের তালিকা দেখাবে।
  • process.getInputStream() ব্যবহার করে আমরা কমান্ডের আউটপুট পড়ছি।
  • process.waitFor() ব্যবহার করে আমরা বাইরের প্রোগ্রামটির termination পর্যন্ত অপেক্ষা করছি এবং শেষে exit code দেখাচ্ছি।

Output (এই কমান্ডটি চালানোর সময় ডিরেক্টরির কনটেন্ট দেখাবে):

C:\Users\YourUsername>dir
... (list of files and directories)
Process terminated with exit code: 0

উদাহরণ 2: বাইরের প্রোগ্রামে ইনপুট পাঠানো

import java.io.*;

public class ExternalProcessInputExample {
    public static void main(String[] args) {
        try {
            // Start a new process running the "ping" command (for Windows)
            Process process = Runtime.getRuntime().exec("ping google.com");

            // Get the output stream to send input to the process
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

            // Send some input (if needed)
            writer.write("input data");
            writer.flush();  // Flush the stream to ensure the data is sent

            // Get the input stream to read the output of the command
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;

            // Read and print the output
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // Wait for the process to finish
            int exitCode = process.waitFor();
            System.out.println("Process terminated with exit code: " + exitCode);

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Explanation:

  • এখানে, ping google.com কমান্ড চালানো হচ্ছে এবং বাইরের প্রোগ্রামের ইনপুট স্ট্রিমে কিছু ডেটা পাঠানোর চেষ্টা করা হয়েছে।
  • বাইরের প্রোগ্রামটি রান করার পর তার আউটপুট পড়া হচ্ছে এবং পরিশেষে প্রোগ্রামটির exit code প্রদর্শন করা হচ্ছে।

Process Management:

  1. Process Monitor: Java এর ProcessBuilder ক্লাসের মাধ্যমে আপনি প্রক্রিয়াগুলি শুরু করতে পারেন এবং তাদের outputerror স্ট্রিমগুলো অ্যাক্সেস করতে পারেন।

উদাহরণ 3: ProcessBuilder ব্যবহার করে বাইরের প্রোগ্রাম চালানো

import java.io.*;

public class ProcessBuilderExample {
    public static void main(String[] args) {
        ProcessBuilder processBuilder = new ProcessBuilder();
        processBuilder.command("ping", "google.com");

        try {
            Process process = processBuilder.start();

            // Get the output of the process
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            int exitCode = process.waitFor();
            System.out.println("Exited with code: " + exitCode);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  • Java Process ক্লাস এবং External Process Management Java প্রোগ্রামে বাইরের প্রোগ্রাম বা সিস্টেম কমান্ড চালানোর জন্য শক্তিশালী এবং নমনীয় মেকানিজম সরবরাহ করে।
  • আপনি exec(), getInputStream(), getOutputStream() এবং waitFor() মেথড ব্যবহার করে বাইরের প্রোগ্রামের আউটপুট এবং ইনপুট ম্যানেজ করতে পারেন।
  • ProcessBuilder ক্লাস ব্যবহার করে আপনি বাইরের প্রোগ্রাম বা কমান্ড আরও ভালভাবে পরিচালনা এবং কনফিগার করতে পারেন।
Content added By

ProcessBuilder ক্লাসের ভূমিকা এবং External Command Execution

258

Java তে ProcessBuilder ক্লাস ব্যবহার করে আপনি external processes বা সিস্টেম কমান্ড চালাতে পারেন এবং সেই প্রক্রিয়া বা কমান্ডের আউটপুট, ইনপুট এবং এরর হ্যান্ডলিং করতে পারেন। এটি মূলত Java অ্যাপ্লিকেশনের বাইরে থাকা কমান্ড বা প্রোগ্রাম চালানোর জন্য ব্যবহৃত হয় এবং এর মাধ্যমে Java অ্যাপ্লিকেশনগুলি operating system commands বা অন্য প্রোগ্রামকে spawn বা execute করতে সক্ষম হয়।

ProcessBuilder ক্লাস:

ProcessBuilder একটি Java ক্লাস যা আপনার প্রোগ্রামের মধ্যে external processes চালানোর জন্য ব্যবহৃত হয়। এটি java.lang.Process অবজেক্ট তৈরি করে যা আপনাকে external process-এর ইনপুট, আউটপুট এবং ত্রুটির স্ট্রিম পরিচালনা করতে সহায়তা করে।

ProcessBuilder ক্লাসের মূল বৈশিষ্ট্যসমূহ:

  1. External Processes চালানো: ProcessBuilder external commands চালানোর জন্য সহজ একটি API প্রদান করে।
  2. Process I/O পরিচালনা: এটি আউটপুট স্ট্রিম (output stream), ইনপুট স্ট্রিম (input stream), এবং error stream গুলির সাথে কাজ করার জন্য সুবিধা প্রদান করে।
  3. Environment Variables: আপনি ProcessBuilder ব্যবহার করে প্রক্রিয়ার পরিবেশ (environment) পরিবর্তন করতে পারেন যেমন environment variables সেট করা।
  4. Working Directory: আপনি external process-এর জন্য কাজের ডিরেক্টরি পরিবর্তন করতে পারেন।
  5. Start and Wait for Process: ProcessBuilder ব্যবহার করে আপনি একটি প্রক্রিয়া শুরু করতে পারেন এবং সেই প্রক্রিয়ার জন্য অপেক্ষা করতে পারেন।

ProcessBuilder ক্লাসের ব্যবহার:

1. ProcessBuilder এর মাধ্যমে External Command চালানো:

import java.io.*;

public class ProcessBuilderExample {
    public static void main(String[] args) {
        try {
            // Create a ProcessBuilder to run an external command
            ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l"); // UNIX command
            processBuilder.redirectErrorStream(true);  // Redirect error stream to output stream

            // Start the process
            Process process = processBuilder.start();

            // Read the output of the command
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // Wait for the command to complete
            int exitCode = process.waitFor();
            System.out.println("Command executed with exit code: " + exitCode);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. ProcessBuilder তৈরি করা হয়েছে, যা ls -l কমান্ডটি চালাবে (UNIX-এ ফাইলের বিস্তারিত তথ্য দেখতে ব্যবহৃত হয়)।
  2. redirectErrorStream(true) কলের মাধ্যমে আমরা ত্রুটি স্ট্রিমকে আউটপুট স্ট্রিমের সাথে একত্রিত করেছি, যাতে ত্রুটি এবং আউটপুট একসাথে দেখা যায়।
  3. start() মেথডটি প্রক্রিয়াটি চালু করে এবং waitFor() মেথডটি প্রক্রিয়া শেষ হওয়া পর্যন্ত অপেক্ষা করে।
  4. BufferedReader ব্যবহার করে আমরা প্রক্রিয়ার আউটপুট পড়ি এবং getInputStream() এর মাধ্যমে প্রক্রিয়ার আউটপুট অ্যাক্সেস করি।

2. ProcessBuilder ব্যবহার করে External Command এর Error Handling:

import java.io.*;

public class ProcessBuilderErrorHandling {
    public static void main(String[] args) {
        try {
            // Try to run a non-existent command
            ProcessBuilder processBuilder = new ProcessBuilder("nonexistentcommand");
            processBuilder.redirectErrorStream(true); // Redirect error to output stream

            Process process = processBuilder.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            int exitCode = process.waitFor();
            System.out.println("Command executed with exit code: " + exitCode);
        } catch (IOException | InterruptedException e) {
            System.out.println("Error executing the command: " + e.getMessage());
        }
    }
}

ব্যাখ্যা:

  • এই উদাহরণে আমরা একটি non-existent কমান্ড চালানোর চেষ্টা করেছি (যেমন nonexistentcommand), যা অবশ্যই ত্রুটি তৈরি করবে।
  • ত্রুটির স্ট্রিমকে আউটপুট স্ট্রিমের সাথে মিশিয়ে ফেলেছি যাতে error message আউটপুট স্ট্রিমে দেখতে পাওয়া যায়।

ProcessBuilder এর অন্যান্য ফিচার:

  1. Environment Variables:
    • আপনি ProcessBuilder এর মাধ্যমে environment variables সেট করতে পারেন, যা external process-এর জন্য প্রয়োজনীয় হতে পারে।
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.environment().put("MY_VAR", "123");  // Set an environment variable
  1. Working Directory:
    • আপনি external process এর কাজের ডিরেক্টরি পরিবর্তন করতে পারেন।
processBuilder.directory(new File("/path/to/directory"));
  1. Redirecting Output to a File:
    • আপনি প্রক্রিয়ার আউটপুট একটি ফাইলে রিডাইরেক্ট করতে পারেন।
processBuilder.redirectOutput(new File("output.txt"));
  1. Combining Input and Output Streams:
    • আপনি input এবং output স্ট্রিমকে একত্রিত করে বিভিন্ন কাজ করতে পারেন, যেমন কনসোলের মাধ্যমে ইনপুট পাঠানো।
processBuilder.redirectInput(new File("input.txt"));

Advantages of Using ProcessBuilder:

  1. Improved Flexibility:
    • ProcessBuilder ব্যবহার করার মাধ্যমে আপনি external processes চালানোর সাথে সাথে সেই প্রক্রিয়ার ইনপুট/আউটপুট স্ট্রিমগুলোর সাথে কাজ করতে পারেন। এটি বিভিন্ন কমান্ড এবং প্রসেসের সাথে আরও সহজ ইন্টারঅ্যাকশন তৈরি করে।
  2. Better Resource Management:
    • আপনি সহজেই প্রক্রিয়ার কাজের ডিরেক্টরি এবং environment variables সেট করতে পারেন, যা আপনাকে আরও অনেক বেশি কাস্টমাইজেশন সুবিধা দেয়।
  3. Error Handling:
    • প্রক্রিয়ার ত্রুটি স্ট্রিমকে handle করার জন্য ProcessBuilder আপনাকে সহজ উপায় দেয় যাতে ত্রুটি বা সিস্টেম error message আপনি লগ করতে পারেন।
  4. Redirecting I/O Streams:
    • ProcessBuilder স্ট্রিম রিডাইরেকশন (input, output, error) করার ক্ষমতা দিয়ে সহজেই external command execution-এর আউটপুট ও ইনপুট নিয়ন্ত্রণ করতে সাহায্য করে।

ProcessBuilder ক্লাস Java-তে external processes চালানোর জন্য একটি শক্তিশালী এবং নমনীয় উপায় প্রদান করে। এটি input/output redirection, environment management, এবং error handling সহজ করে তোলে। একাধিক কমান্ড চালানো বা সিস্টেম কমান্ডের মাধ্যমে কাজ করতে Java অ্যাপ্লিকেশনগুলির সাথে ইন্টিগ্রেটেডভাবে কাজ করা সহজ হয়ে যায়।

Content added By

Process থেকে Output এবং Exit Status হ্যান্ডল করা

261

java.lang.Process ক্লাস Java-তে সিস্টেম প্রক্রিয়া পরিচালনা করার জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি বাইরের সিস্টেম প্রোগ্রাম বা কমান্ড চালাতে পারেন এবং সেই প্রোগ্রাম বা কমান্ডের আউটপুট এবং এক্সিট স্ট্যাটাস গ্রহণ করতে পারেন। Process ক্লাসটি Java ProcessBuilder এবং Runtime ক্লাসের মাধ্যমে সিস্টেম কমান্ড এক্সিকিউট করতে ব্যবহৃত হয়।

Process ক্লাস:

Process ক্লাস Java অ্যাপ্লিকেশন থেকে এক্সটার্নাল প্রোগ্রাম বা কমান্ড চালানোর জন্য ব্যবহৃত হয়। এটি আপনি ProcessBuilder অথবা Runtime.getRuntime().exec() মেথডের মাধ্যমে কল করতে পারেন। এই ক্লাসটি বাইরের প্রোগ্রাম থেকে ইনপুট, আউটপুট এবং ত্রুটি স্ট্রিম পরিচালনার সুযোগ দেয়।

Process এর মাধ্যমে Output এবং Exit Status হ্যান্ডল করা:

  1. Output Handling (স্ট্যান্ডার্ড আউটপুট):
    • বাইরের প্রোগ্রাম চালানোর পর আপনি প্রোগ্রামটির আউটপুট ক্যাপচার করতে পারবেন। এর জন্য আপনি Process.getInputStream() মেথড ব্যবহার করতে পারেন।
    • আউটপুট স্ট্রিমের মাধ্যমে প্রাপ্ত ডেটা InputStreamReader এবং BufferedReader ব্যবহার করে পড়া যায়।
  2. Exit Status Handling (Exit Code):
    • সিস্টেম প্রোগ্রাম বা কমান্ড চালানোর পর, Process.exitValue() মেথডটি প্রক্রিয়ার এক্সিট স্ট্যাটাস বা exit code প্রদান করে।
    • Exit code 0 সাধারণত সফল কার্যক্রমের জন্য ব্যবহৃত হয়, এবং অন্য কোডগুলি ত্রুটির নির্দেশ দেয়।

Process থেকে Output এবং Exit Status হ্যান্ডল করার উদাহরণ:

এখানে আমরা একটি প্রক্রিয়া চালাবো (উদাহরণস্বরূপ dir কমান্ড উইন্ডোজের জন্য বা ls কমান্ড লিনাক্সের জন্য) এবং তার আউটপুট এবং এক্সিট স্ট্যাটাস হ্যান্ডল করবো।

উদাহরণ 1: ProcessBuilder ব্যবহার করে (Windows Command dir):

import java.io.*;

public class ProcessExample {
    public static void main(String[] args) {
        try {
            // Windows এর জন্য ProcessBuilder ব্যবহার করে 'dir' কমান্ড চালানো
            ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "dir");
            processBuilder.redirectErrorStream(true);  // Error এবং Output একই স্ট্রিমে পাঠানো হবে

            // প্রক্রিয়া চালানো
            Process process = processBuilder.start();

            // Output Stream থেকে আউটপুট পড়ে নেয়া
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);  // আউটপুট প্রিন্ট করা
            }

            // Exit Status বা Exit Code পাওয়া
            int exitCode = process.waitFor();
            System.out.println("Process Exit Status: " + exitCode);  // Exit Status (0 indicates success)

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

উদাহরণ 2: ProcessBuilder ব্যবহার করে (Linux Command ls):

import java.io.*;

public class ProcessExampleLinux {
    public static void main(String[] args) {
        try {
            // Linux এর জন্য ProcessBuilder ব্যবহার করে 'ls' কমান্ড চালানো
            ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l");
            processBuilder.redirectErrorStream(true);  // Error এবং Output একই স্ট্রিমে পাঠানো হবে

            // প্রক্রিয়া চালানো
            Process process = processBuilder.start();

            // Output Stream থেকে আউটপুট পড়ে নেয়া
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);  // আউটপুট প্রিন্ট করা
            }

            // Exit Status বা Exit Code পাওয়া
            int exitCode = process.waitFor();
            System.out.println("Process Exit Status: " + exitCode);  // Exit Status (0 indicates success)

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

বিষয়গুলির ব্যাখ্যা:

  1. ProcessBuilder:
    • ProcessBuilder ক্লাসটি বাহ্যিক প্রোগ্রাম বা কমান্ড চালানোর জন্য ব্যবহৃত হয়। এটি প্রক্রিয়া তৈরি করতে এবং সেই প্রক্রিয়াটির ইনপুট, আউটপুট, এবং ত্রুটি স্ট্রিম পরিচালনা করতে ব্যবহৃত হয়।
    • redirectErrorStream(true) ব্যবহার করে ত্রুটির স্ট্রিম এবং আউটপুট স্ট্রিম একত্রিত করা যায়।
  2. getInputStream():
    • এই মেথডটি প্রক্রিয়ার আউটপুট স্ট্রিম প্রদান করে। আমরা এই স্ট্রিমটি ব্যবহার করে বাহ্যিক প্রোগ্রামের আউটপুট পেতে পারি।
  3. waitFor():
    • waitFor() মেথডটি প্রক্রিয়ার এক্সিট স্ট্যাটাস প্রদান করে। এটি থ্রেডটি ব্লক করে যতক্ষণ না প্রক্রিয়া শেষ হয় এবং প্রক্রিয়ার এক্সিট কোড প্রদান করে।
  4. Exit Code:
    • প্রোগ্রামটি সফলভাবে শেষ হলে, exitValue() মেথডটি 0 রিটার্ন করে, এবং যদি কোনও ত্রুটি ঘটে, তবে এটি অন্য কোড রিটার্ন করে (যেমন 1, 2 ইত্যাদি)।

Exit Status Code:

  • Exit code 0: কমান্ড সফলভাবে সম্পন্ন হয়েছে।
  • Exit code 1 বা অন্য কোড: সাধারণত ত্রুটি বা ব্যতিক্রম ঘটেছে।

সামগ্রিকভাবে:

  • Process ক্লাস এবং ProcessBuilder Java তে বাহ্যিক প্রোগ্রাম বা সিস্টেম কমান্ড চালানোর জন্য খুবই কার্যকরী। এর মাধ্যমে আপনি প্রক্রিয়ার আউটপুট এবং এক্সিট স্ট্যাটাস সংগ্রহ করতে পারেন, যা সিস্টেম লেভেল কার্যক্রম বা স্ক্রিপ্ট চালানোর জন্য ব্যবহৃত হয়।
Content added By

Runtime.exec() এবং ProcessBuilder এর মধ্যে পার্থক্য

252

Runtime.exec() এবং ProcessBuilder দুটি Java API যা সিস্টেম কমান্ড বা এক্সটার্নাল প্রোগ্রাম চালানোর জন্য ব্যবহৃত হয়। তবে এই দুটি API এর মধ্যে কিছু পার্থক্য রয়েছে, যেমন তাদের সুবিধা, ব্যবহার এবং কনফিগারেশন।

1. Runtime.exec()

Runtime.exec() মেথডটি Java অ্যাপ্লিকেশনের মধ্যে সিস্টেম কমান্ড বা প্রোগ্রাম এক্সিকিউট করতে ব্যবহৃত হয়। এটি Runtime ক্লাসের একটি মেথড যা একটি নতুন প্রক্রিয়া (process) চালু করে এবং এটি একটি Process অবজেক্ট রিটার্ন করে।

ব্যবহার:

  • Runtime.exec() শুধুমাত্র স্ট্রিং প্যারামিটার হিসেবে সিস্টেম কমান্ড বা প্রোগ্রাম চালাতে পারে।
  • এটি সিঙ্গেল কমান্ড বা কমান্ড লাইনে একটি একক প্রোগ্রাম রান করানোর জন্য উপযোগী।
  • এই মেথডটি খুব সাধারণ এবং অল্প কিছু অপশন দিয়ে সিস্টেম প্রোগ্রাম চালানোর সুবিধা দেয়।

সিনট্যাক্স:

public Process exec(String command) throws IOException
public Process exec(String[] cmdarray) throws IOException
public Process exec(String command, String[] envp) throws IOException

উদাহরণ:

public class RuntimeExecExample {
    public static void main(String[] args) {
        try {
            String command = "notepad.exe"; // Open Notepad in Windows
            Process process = Runtime.getRuntime().exec(command);
            System.out.println("Notepad launched!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

আউটপুট:

Notepad launched!

এখানে, Runtime.getRuntime().exec(command) মেথডটি একটি সিস্টেম প্রোগ্রাম (যেমন, notepad.exe) চালু করেছে।

2. ProcessBuilder

ProcessBuilder Java-র একটি ক্লাস যা Process অবজেক্ট তৈরি করতে ব্যবহৃত হয় এবং এটি আরও উন্নত কনফিগারেশন এবং পরিবেশগত কনফিগারেশন (environment configuration) প্রদান করে। এটি Runtime.exec() থেকে বেশি সুবিধা প্রদান করে এবং একাধিক কমান্ড একসাথে চালানো, ইনপুট আউটপুট (I/O) স্ট্রিম নিয়ন্ত্রণ, এবং প্রসেসের পরিবেশ (environment) সেটিংস আরও সহজভাবে পরিচালনা করতে সহায়তা করে।

ব্যবহার:

  • ProcessBuilder আরও উন্নত এবং নমনীয়, যেমন একাধিক আর্গুমেন্ট গ্রহণ করতে পারে এবং প্রসেসের পরিবেশ এবং স্ট্রিম পরিচালনা করতে সাহায্য করে।
  • এটি ব্যবহারকারীর প্রক্রিয়া পরিচালনা এবং সংশ্লিষ্ট আউটপুট বা ইনপুট স্ট্রিম প্রসেসিংয়ের জন্য উপযুক্ত।

সিনট্যাক্স:

public class ProcessBuilder {
    public ProcessBuilder(String... command)
    public Process start() throws IOException
    public void directory(File directory)
    public Map<String, String> environment()
}

উদাহরণ:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class ProcessBuilderExample {
    public static void main(String[] args) {
        ProcessBuilder processBuilder = new ProcessBuilder("notepad.exe");
        
        try {
            // Start the process
            Process process = processBuilder.start();
            System.out.println("Notepad launched!");
            
            // Wait for the process to terminate
            process.waitFor();
            
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

আউটপুট:

Notepad launched!

এখানে, ProcessBuilder ব্যবহার করে notepad.exe প্রোগ্রামটি চালানো হয়েছে, এবং এটি আরও কাস্টমাইজড এবং কনফিগারযোগ্য।

Runtime.exec() এবং ProcessBuilder এর মধ্যে পার্থক্য:

বৈশিষ্ট্যRuntime.exec()ProcessBuilder
সিনট্যাক্স এবং সহজতাসরল এবং সহজ, কিন্তু কাস্টমাইজেশন কম।অনেক বেশি নমনীয় এবং কাস্টমাইজেবল।
একাধিক আর্গুমেন্টএটি একক স্ট্রিং বা স্ট্রিং অ্যারে নেয়ার মাধ্যমে কমান্ড এক্সিকিউট করতে পারে।এটি একাধিক আর্গুমেন্ট সহজে গ্রহণ করে এবং কমান্ডের পরিবেশ এবং ডিরেক্টরি নির্ধারণের জন্য ভাল।
I/O স্ট্রিম নিয়ন্ত্রণI/O স্ট্রিম (input/output) নিয়ন্ত্রণের জন্য অতিরিক্ত কনফিগারেশন প্রয়োজন।স্ট্যান্ডার্ড ইনপুট, আউটপুট এবং এরর স্ট্রিম নিয়ন্ত্রণের জন্য সহজ।
প্রসেস পরিবেশ কনফিগারেশনসরাসরি পরিবেশ কনফিগারেশন সুবিধা প্রদান করে না।environment() মেথডের মাধ্যমে পরিবেশ কনফিগারেশন প্রদান করা যায়।
ব্যবহারযোগ্যতাসহজ এবং দ্রুত, তবে কম কাস্টমাইজেশন।বেশি ফ্লেক্সিবিলিটি এবং কাস্টমাইজেশন সহ।
সিস্টেম কমান্ড ও প্রসেস ব্যবস্থাপনাএক বা দুটি সিস্টেম কমান্ড রান করতে ব্যবহার করা হয়।একাধিক কমান্ড এবং কাস্টম প্রসেস ব্যবস্থাপনা খুব সহজ।
স্ট্রিম পাসিংস্ট্রিম পাসিং খুবই জটিল এবং অতিরিক্ত কোড প্রয়োজন।এটি স্ট্রিম পাসিংকে সহজ করে দেয় এবং পিএসসি স্ট্রিম নিয়ন্ত্রণ সহজ হয়।
  • Runtime.exec() মেথডটি একটি সরল পদ্ধতি যা সিস্টেম কমান্ড চালানোর জন্য ব্যবহৃত হয়, তবে এতে কাস্টমাইজেশন এবং স্ট্রিম নিয়ন্ত্রণের সুবিধা সীমিত।
  • ProcessBuilder ক্লাসটি আরও উন্নত এবং নমনীয়, যা কমান্ডের পরিবেশ, ইনপুট/আউটপুট স্ট্রিম, এবং অন্যান্য কনফিগারেশন নির্ধারণের জন্য বেশি সুবিধা প্রদান করে।

যদি আপনার একটি সাধারন কমান্ড এক্সিকিউট করতে হয় এবং পরিবেশের নিয়ন্ত্রণের প্রয়োজন না থাকে, তবে Runtime.exec() সহজ এবং দ্রুত। কিন্তু যদি আপনাকে একাধিক কমান্ড, পরিবেশ কনফিগারেশন, বা স্ট্রিম নিয়ন্ত্রণের প্রয়োজন হয়, তবে ProcessBuilder বেশি উপযুক্ত।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...